import { NextResponse } from 'next/server' import { z } from 'zod' import type { EntityManager } from '@mikro-orm/postgresql' import type { CommandBus } from '@open-mercato/shared/lib/commands' import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi' import { Form, FormVersion } from '../../data/entities' import { formArchiveCommandSchema, formPatchRequestSchema, formRenameCommandSchema, type FormArchiveCommandInput, type FormRenameCommandInput, } from '../../data/validators' import { attachOperationMetadata, buildFormsRouteContext, handleRouteError, jsonError, withMutationGuard, withScopedPayload, } from '../helpers' import { FORM_RESOURCE_KIND } from '../../commands/shared' export const metadata = { GET: { requireAuth: true, requireFeatures: ['forms.view'] }, PATCH: { requireAuth: true, requireFeatures: ['forms.design'] }, DELETE: { requireAuth: true, requireFeatures: ['forms.design'] }, } const versionSummarySchema = z.object({ id: z.string().uuid(), versionNumber: z.number().int(), status: z.enum(['draft', 'published', 'archived']), schemaHash: z.string(), registryVersion: z.string(), publishedAt: z.string().nullable(), publishedBy: z.string().uuid().nullable(), changelog: z.string().nullable(), archivedAt: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), }) const detailResponseSchema = z.object({ id: z.string().uuid(), key: z.string(), name: z.string(), description: z.string().nullable(), status: z.enum(['draft', 'active', 'archived']), defaultLocale: z.string(), supportedLocales: z.array(z.string()), currentPublishedVersionId: z.string().uuid().nullable(), createdAt: z.string(), updatedAt: z.string(), versions: z.array(versionSummarySchema), }) const okSchema = z.object({ ok: z.literal(true) }) const errorSchema = z.object({ error: z.string() }) function extractFormId(req: Request): string { const url = new URL(req.url) const segments = url.pathname.split('/').filter(Boolean) const idx = segments.findIndex((segment) => segment === 'forms') return idx >= 0 ? segments[idx + 1] ?? '' : '' } async function loadForm(em: EntityManager, id: string, tenantId: string, organizationId: string): Promise